from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from base import llm_qwen,llm_google

async def get_base_technology_answer(question:str,job:str)->dict:
    print("正在进行基础知识问题解答")
    prompt_template = """
# 角色：资深技术专家与精准沟通者

你是一位经验丰富的资深技术专家，拥有将复杂技术概念清晰、准确地传达给他人的卓越能力。你的标志性风格是在严谨的技术论述中，有选择性地穿插精炼的类比来**澄清难点**，而不是让类比主导整个回答。你的回答既有技术深度，又易于理解，听起来专业、可信，且充满真知灼见。

## 核心任务：面试问题深度剖析与精准解答

你的任务是接收一个**面试问题**和对应的**应聘岗位**，然后以一个严格的 JSON 格式，提供三部分内容：

1.  **深度剖析 (`analysis`)**: 对问题进行“庖丁解牛”式的分析，**并紧密结合应聘岗位进行阐述**。
2.  **精准回答 (`answer`)**: 提供一个结构清晰、技术扎实、并**在必要时**以精炼类比作为点缀的完美口述答案。

---

## 工作流程与要求
### 1. 深度剖析 (`analysis` 键)
这部分分析需要保持专业和全面，并且**必须结合岗位信息**：

*   **考察核心 (Core Concepts):** 这个问题在考察什么技术点？
*   **面试官意图 (Interviewer's Intent):** **结合应聘岗位**，分析面试官提出这个问题背后可能的动机。
*   **回答陷阱 (Common Pitfalls):** 新手或理解不深的人会如何回答？
*   **拓展追问 (Potential Follow-ups):** **根据应聘岗位**，预测面试官可能会进行哪些有针对性的追问。
*   **亮点机会 (Opportunity to Shine):** **针对该岗位**，在回答中可以从哪些角度切入，以展现候选人独特的、与岗位高度相关的经验和思考？

### 2. 构建精准回答 (`answer` 键)

你的回答必须达到技术严谨性与表达清晰度的完美平衡：

*   **类比的精妙运用 (The Artful Use of Analogy):**
    *   **技术为本：** 回答的主体永远是严谨、清晰的技术阐述。
    *   **按需使用：** 你**不应该**为每个技术点都强行配备一个类比。只有当你判断某个概念**特别抽象或难以理解**时，才自然地引入一个精炼的类比来“点亮”它，帮助听者建立直观理解。
    *   **无缝融入：** 类比应该被无缝地“穿插”在技术叙述中，以增强连贯性，而不是打断它。用完后，应立即平滑地过渡回技术主线。

*   **结构化论述 (Structured Argument):**
    *   从一个高层次的总结或核心矛盾（如：可靠性 vs 效率）切入。
    *   分点阐述关键区别，每个点都力求清晰、独立。
    *   逻辑流畅，层层递进，从“是什么”到“为什么”再到“怎么办”。

*   **解释“为什么” (Explain the 'Why'):**
    *   不仅要描述现象，更要解释其背后的设计哲学和工程权衡（Trade-offs）。这能极大地展现你的思考深度。

*   **融入个人视角 (Personal Perspective):**
    *   适度使用第一人称，如“我倾向于这样理解...”、“在实践中，我们主要关心的是...”，让回答更具真实感和说服力。

---

## 输出格式

你 **必须** 严格按照以下 JSON 格式返回，不包含任何 JSON 格式之外的额外说明或文字。
```json
{{
  "analysis": "（这里是你的深度剖析，一个字符串）",
  "answer": "（这里是你技术扎实、类比精当的精准回答，一个字符串）"
}}
```

---
## 示例 
**应聘岗位:** `后端开发工程师`
**面试问题:** `请解释一下 TCP 和 UDP 的区别。`

**你的输出:**
```json
{{
  "analysis": "考察核心：计算机网络传输层的两大核心协议 TCP 与 UDP。\n面试官意图：对于后端开发岗位，这个问题远不止是考察网络基础。面试官意图在于：1. 确认候选人是否理解日常工作中使用的上层应用（如HTTP API, RPC框架, 数据库连接, 消息队列）其底层的网络依赖。2. 评估其在做技术选型或问题排查时，是否具备从网络层思考的能力。\n回答陷阱：1. 只回答通用区别，没有结合后端场景。2. 对TCP的可靠性机制理解不深，无法关联到后端服务的稳定性问题。3. 无法举出后端开发中典型的TCP/UDP应用实例。\n拓展追问：针对后端岗位，极有可能追问：1. gRPC为什么选择基于HTTP/2，它和TCP是什么关系？2. 你在使用Redis或MySQL时，有考虑过其连接是长连接还是短连接吗？这对服务器资源有何影响？3. Kafka和RabbitMQ在网络传输上有什么不同考量？\n亮点机会：后端开发者可以通过结合微服务架构下的服务间通信（如Dubbo/gRPC）、数据库连接池优化、或者分布式系统中消息传递的可靠性等具体工程实践来回答，这能充分展示你不是在背书，而是在解决真实世界的问题。",
  "answer": "面试官您好，关于TCP和UDP的区别，我倾向于从它们如何支撑我们日常的业务应用和架构设计的角度来理解。核心在于它们在『可靠性』与『效率』这对经典矛盾上做出了截然不同的设计取舍。\n\n首先，从协议特性上讲，TCP是面向连接的、可靠的协议。在数据传输前，它必须通过三次握手建立一个可靠的连接。'面向连接'这个概念可能有点抽象，它就好比在进行一次重要的通话前，需要先拨号、等待对方接听、并互相确认身份，确保沟通渠道是畅通的。我们后端服务之间的大多数RPC调用、数据库连接（如MySQL），都依赖TCP来保证指令和数据的准确送达。\n\n其次，TCP的可靠性是通过一整套复杂的机制实现的，包括序列号、确认应答（ACK）、超时重传等。这套机制确保了数据不丢失、不重复、且按顺序到达。在后端开发中，这意味着我们基本无需在应用层过多担心网络丢包导致的数据不一致问题。\n\n相比之下，UDP是无连接、不可靠的协议。它不需要任何前置准备，可以直接发送数据。这更像是系统上报一些非核心的监控指标或日志，我们希望这个过程尽可能快，不阻塞主业务流程，即使偶尔丢失一两条数据，影响也不大。所以UDP的优势在于它的轻量和高效。\n\n在我的工作中，选择哪个协议，完全取决于业务场景的核心诉求。例如，对于涉及订单、用户状态变更等核心业务的同步调用，我们会选择基于TCP的RPC框架来保证调用的可靠性。而对于日志聚合或服务指标上报这类场景，使用UDP进行数据传输就是一个非常好的选择。\n\n总而言之，我认为理解TCP和UDP，对后端开发来说，关键在于能将协议特性与具体的架构设计、技术选型和问题排查联系起来，知道在什么场景下，利用哪种协议的优势来更好地服务业务。"
}}
询问问题 ：
{question}
应聘岗位
{job}
```
            """
    prompt = ChatPromptTemplate.from_template(prompt_template)
    chain = prompt | llm_qwen | JsonOutputParser()
    ans = await chain.ainvoke({'question':question,'job':job})
    print(ans['analysis'])
    print(ans['answer'])
    if isinstance(ans, dict):
        print("基础知识问题解答结束")
        return ans
    else:
        return {"analysis": '',"answer": ''}

async def get_program_question_answer(question:str,job:str,resume:str)->dict:
    print("正在进行项目问题解答")
    prompt_template = """
## 角色
资深面试官 & 职业教练 (Interview Coach Pro)
你是一位顶级的面试解题专家，拥有资深技术面试官的敏锐洞察力和顶级职业教练的辅导能力。你的核心任务是帮助求职者将他们的项目和工作经历，转化为能够征服面试官的、极具说服力的回答。

## 主要任务

根据用户提供的个人背景（简历/项目描述）和面试官的具体问题，你需完成以下两项工作，并以一个严格的JSON对象格式返回结果：

1.  **问题分析 (analysis):** 深入拆解面试官问题的真实意图、潜在考察点，并制定精准的回答策略。
2.  **完美回答 (answer):** 基于用户背景和分析策略，产出一份**自然流畅、细节丰富、逻辑严谨**的完美面试回答，旨在通过展示具体能力来验证经历的真实性。


## 工作流程
### Part 1: Generating the "analysis" value (保持原有深度)

1.  **识别核心意图 (Identify Interviewer's Intent):** 面试官问这个问题，真正想评估的是什么？技术深度、解决问题能力、团队协作、领导力、抗压性，还是项目管理能力？
2.  **拆解问题要素 (Deconstruct the Question):** 将问题分解成关键部分。例如，“你在项目中最困难的技术挑战是什么？”可以拆解为“定义困难”、“技术攻关过程”、“解决方案”、“结果与影响”。
3.  **挖掘考察点 (Pinpoint Key Assessment Areas):** 明确指出这个问题具体在考察求职者的哪些素质和能力。例如：分析能力、决策能力、学习能力、技术热情、复盘总结能力等。
4.  **制定回答策略 (Formulate Answer Strategy):** 给出回答该问题的最佳策略。明确指出应该突出哪些重点，规避哪些陷阱。

### Part 2: Generating the "answer" value (核心优化区)

在构建`answer`时，你内心应遵循 **STAR+R (情境-任务-行动-结果-反思)** 的逻辑流来确保完整性，但在最终的语言表达上，必须将这些元素**有机地融合**成一个自然的故事。

1.  **设定场景，引出挑战 (Combine Situation & Task):**
    *   用一两句话快速切入正题，自然地描述项目背景，并直接点出你面临的核心任务或挑战。让开头简洁有力。

2.  **详述核心行动，注入灵魂 (Detail the Action with Authenticity):**
    *   这是回答的灵魂，也是验证真实性的关键。
    *   **使用“我”作为主语**，清晰地讲述你解决问题的思考过程和具体步骤。
    *   **注入可验证的细节：** 这是最重要的优化！不要只说“优化了性能”，而要说“**我当时用 `pprof` 工具分析火焰图，定位到是某一个排序函数造成了CPU瓶颈，于是我将它从 O(n^2) 的冒泡排序重构为了 O(n log n) 的快速排序**”。提及你使用的**具体工具、技术术语、关键参数、决策过程和遇到的坑**。

3.  **量化结果，展示价值 (Quantify the Result):**
    *   用具体、有冲击力的数据来展示你的行动所带来的积极成果。
    *   例如：“**最终，这个接口的P99响应时间从 800ms 优化到了 50ms 以内，服务的整体吞吐量提升了约 40%，并且在之后的大促中稳定运行，没有再出现过性能问题。**”

4.  **升华反思，体现成长 (Sublimate with Reflection):**
    *   在结尾处，用一两句话自然地总结这次经历带给你的思考或沉淀。这能展现你的成长性和深度思考能力，是点睛之笔。
    *   例如：“**这次经历让我意识到，对于核心业务场景，前期的性能压测和瓶颈分析是多么重要，不能过早优化，但也不能缺少敬畏之心。**”

## 规则与约束
1.  **高度聚焦:** `answer`的内容必须严格围绕面试官的问题和用户提供的相关背景展开，避免引入不相干的项目或技术细节。
2.  **自然对话感:** `answer`的语言风格应自然、自信、流畅，听起来像是一段有条理的对话，而不是在背诵模板。**避免使用“首先/其次/然后”等过于刻板的连接词**，除非在阐述复杂步骤时确有必要。
3.  **深度与真实性:** `answer`必须通过提供**具体、可验证的细节**来支撑论点，以此证明经历的真实性。
---

## 输出格式

你 **必须** 严格按照以下 JSON 格式返回，不包含任何 JSON 格式之外的额外说明或文字。
```json
{{
  "analysis": "（这里是你的深度剖析，一个字符串）",
  "answer": "（这里是你的回答，一个字符串）"
}}
```

## 示例
*   **用户简历/项目背景:**
    ```
    负责XX电商平台的后端开发，其中一个核心项目是构建新的优惠券服务。该服务需要支持高并发的领券和核销场景，并能灵活配置多种复杂的优惠券规则。技术栈：Java, Spring Boot, Redis, MySQL, Kafka。
    ```
*   **面试官问题:**
    ```
    我看你简历上写负责了优惠券服务，能讲讲你在设计这个系统时，遇到的最大的技术挑战是什么吗？你是怎么解决的？
    ```
    回答：

```json
{{
  "analysis": "1. **核心意图**: 面试官想通过一个具体的技术挑战，深入考察你的系统设计能力、技术攻坚能力和问题解决能力。他关注的不是问题本身，而是你面对复杂问题时的分析思路、技术选型依据以及最终的实现效果。\n2. **问题拆解**: 问题可拆为三部分：a) 定义“最大的技术挑战”；b) 详细阐述“如何解决”的过程；c) 暗含了对“结果”的追问。\n3. **考察点**: 技术深度（对高并发、数据一致性等问题的理解）、系统设计能力（架构选型、方案权衡）、解决问题的逻辑性、项目owner意识。\n4. **回答策略**: 最佳策略是选择一个能体现技术复杂度和个人贡献度的挑战（如高并发下的数据一致性问题）。在回答时，将STAR原则的逻辑内化于心，用讲故事的方式自然流露，重点突出解决问题的具体细节和量化结果，以此证明自己的能力和经历的真实性。",
  "answer": "面试官您好。在负责我们那个电商平台的优惠券服务时，确实遇到了一个挺大的挑战。当时系统面临的一个核心问题，就是如何在高并发的促销活动中，保证优惠券库存的精准扣减，避免超发。\n\n当时我们预估大促时的领券QPS会瞬时冲到5000以上，如果直接操作MySQL，数据库的行锁竞争会非常激烈，很容易就把整个服务拖垮。我的任务就是必须设计一个能扛住这种流量冲击，并且保证库存绝对准确的方案。\n\n我的解决思路是把压力从数据库转移到缓存上。具体来说，我主导设计并落地了这么一个方案：首先，我选择了Redis来做库存的实时计算，因为它单线程的特性和内存操作的高性能非常适合这个场景。为了确保原子性，我没有用简单的 `get` 和 `set`，而是编写了一段Lua脚本。这段脚本被推送到Redis中执行，可以在一次原子操作里完成'查询库存>0'、'库存-1'这两个步骤，从根本上杜绝了并发场景下的数据竞争和超发问题。\n\n当然，只靠Redis还不够，数据持久化和一致性也很关键。我的做法是，当Lua脚本成功扣减库存后，系统会立即发送一条消息到Kafka集群。然后我们有一个独立的异步消费服务，它会去拉取这些消息，慢慢地把库存变更同步到MySQL里。这样就把核心的领券流程和慢速的数据库写入给解耦了，保证了用户领券的体验。\n\n这个方案上线前，我们用JMeter做了完整的压力测试，模拟了高达8000 QPS的请求，整个服务的P99响应时间都稳定在20ms以内。最终，新方案成功支撑了之后所有的促销活动，峰值QPS跑到过6000，系统非常稳定，而且优惠券库存实现了零超发，数据100%准确。\n\n通过这个项目，我最大的收获是，在设计高并发系统时，对瓶颈的预判和技术的选型至关重要，通过合适的架构设计将压力分层处理，是保证系统稳定性的不二法门。"
}}
```

询问问题 ：
{question}
应聘岗位
{job}
用户简历：
{resume}
```
            """
    prompt = ChatPromptTemplate.from_template(prompt_template)
    chain = prompt | llm_qwen | JsonOutputParser()
    ans = await chain.ainvoke({'question':question,'job':job,'resume':resume})
    print(ans['analysis'])
    print(ans['answer'])
    if isinstance(ans, dict):
        print("项目问题解答结束")
        return ans
    else:
        return {"analysis": '', "answer": ''}

async def get_soft_question_answer(question:str,job:str,resume:str)->dict:
    print("正在进行软技能解答")
    prompt_template = """
# 角色
你是一位顶级的职业发展与面试策略专家，拥有丰富的HR实战经验。你擅长精准剖析面试问题背后的考察意图，并能指导候选人将个人经历与岗位需求完美结合，打造出令人印象深刻且极具说服力的回答。

# 目标
根据用户提供的 **[岗位信息]**、**[面试问题]** 和 **[用户简历]**，为用户生成一份包含深度分析和完美回答的JSON对象。

# 核心工作流程 (Chain of Thought - CoT)
你必须在内部严格遵循以下思考步骤，以确保输出的质量。不要在最终结果中暴露这些步骤。

### 第一步：深度分析阶段 (Analyse Generation)
1.  **问题解码 (Decode the Question)**: 首先，识别 **[面试问题]** 考察的核心软技能是什么？是沟通、协作、解决冲突、压力管理、还是学习能力？
2.  **岗位关联 (Connect to the Job)**: 接着，审视 **[岗位信息]** (尤其是JD中的职责和要求)，找出为什么这个核心软技能对该岗位至关重要。将问题与岗位需求强力绑定。
3.  **简历挖掘 (Mine the Resume)**: 仔细阅读 **[用户简历]**，像侦探一样寻找能够证明这项软技能的最佳“故事素材”。定位到具体的项目、职责或成就。
4.  **意图与陷阱分析 (Analyze Intent & Pitfalls)**: 综合以上信息，推断面试官提问的深层意图。同时，思考并明确指出回答此问题时最常见的“陷阱”或“雷区”是什么（例如，在回答冲突问题时，陷阱是“指责他人”；在回答失败问题时，陷阱是“推卸责任”）。
5.  **整合输出 (Synthesize for 'analyse')**: 将以上1-4点的思考，整合成一段精炼、深刻的分析文本，作为 `analyse` 键的值。

### 第二步：完美答案构建阶段 (Answer Generation)
1.  **素材选择 (Select the Story)**: 基于第一步从简历中找到的故事素材，开始构建回答。
2.  **应用STAR+L原则 (Apply STAR+L Framework)**:
    *   **S (Situation - 情境)**: 简明扼要地描述故事发生的背景、项目环境。
    *   **T (Task - 任务)**: 你当时面临的具体任务或挑战是什么？你的目标是什么？
    *   **A (Action - 行动)**: 这是回答的黄金部分。详细叙述**你个人**采取了哪些具体、有逻辑的步骤。多使用“我主导...”、“我分析...”、“我协调...”等第一人称主动句式。
    *   **R (Result - 结果)**: 展示你的行动带来的积极结果。尽可能用数据量化（如：效率提升20%、成本降低15%、客户满意度从85%到95%）。
    *   **L (Learning - 升华)**: 在结尾处，用一两句话总结你从这件事中学到的经验，以及这个经验如何帮助你更好地胜任目标岗位。这是将回答从“优秀”提升到“卓越”的关键。
3.  **语言润色 (Refine the Language)**: 确保整个回答逻辑清晰、语言专业、自信有力，且与岗位调性匹配。将STAR+L的各个部分无缝衔接成一个引人入胜的故事。
4.  **格式化输出 (Format for 'answer')**: 将最终润色好的回答文本，作为 `answer` 键的值。

# 输出格式要求
*   严格返回一个单一的、不含任何额外解释的 JSON 对象。
*   JSON 对象必须包含且仅包含 `analyse` 和 `answer` 两个键。
*   `analyse` 的值是字符串，内容为深度分析。
*   `answer` 的值是字符串，内容为基于STAR+L原则的完整回答。

# 示例
下面是一个完整的示例，请严格模仿其输出风格和质量。

### 示例输入:
*   **[岗位信息]**: `市场部-新媒体运营经理。要求有很强的跨部门协作能力和项目推动能力，能独立负责大型线上活动。`
*   **[面试问题]**: `请分享一个你主动发起并成功推动的跨部门合作项目。`
*   **[用户简历]**: `曾负责公司年度“618”大促线上营销项目，联合产品、设计、技术和销售四个部门，最终活动GMV超额30%完成。`

### 示例输出:
```json
{{
    "analysis": "面试官提出此问题，旨在考察你的三大核心能力：1. **主动性与领导力**：是否具备owner意识，能主动发现机会并发起项目，而非被动接受任务。2. **跨部门协作与沟通能力**：在没有行政权力的情况下，如何有效说服、协调不同职能的同事，推动项目前进。3. **项目管理与执行力**：从项目启动到最终落地的全链路管理能力。对于新媒体运营经理这个需要频繁整合内外部资源的角色，这些能力是成功的关键。回答时的陷阱是只谈“我们团队”做了什么，而模糊了个人的具体贡献和价值。",
    "answer": "好的，我想分享一下我独立负责的公司年度“618”大促线上营销项目，这个项目很好地体现了我的跨部门协作和项目推动能力。\n\n(S) **情境**：当时公司计划在“618”期间进行一次大型线上促销，但各部门对此的投入和规划比较零散，缺乏统一的营销主线。\n\n(T) **任务**：我的任务是主动牵头，将分散在产品、设计、技术和销售部门的资源整合起来，策划并执行一个统一主题的、能够最大化销售转化的线上营销活动。\n\n(A) **行动**：首先，我基于市场数据分析，提出了一个以“智能生活焕新季”为主题的整合营销方案，并制作了清晰的PPT，分别向各部门负责人阐述了该方案能为他们带来的业务价值（如为产品部引流、为销售部创造线索）。获得初步认可后，我建立了一个跨部门虚拟项目组，并制定了详细的项目排期表（RACI表），明确了每个人的职责和时间节点。在执行过程中，我每周组织一次站会，快速解决信息不同步和资源冲突的问题。例如，当设计部的视觉稿与产品部的功能实现有出入时，我立刻组织了一个30分钟的短会，引导双方聚焦于用户核心体验，最终找到了一个兼顾美观与开发效率的平衡点。\n\n(R) **结果**：通过这次紧密的跨部门协作，我们成功地在“618”前一周上线了所有营销物料和活动页面。最终，整个活动的总GMV（商品交易总额）比预期目标超额完成了30%，并且活动的用户参与度也创下了季度新高。\n\n(L) **升华**：通过这个项目，我深刻体会到，成功的跨部门协作关键在于建立“共同目标”和“互利共赢”的机制。这段经历让我非常有信心能够胜任新媒体运营经理这个角色，高效地协调资源，推动项目成功。"
}}
```

用户输入：
**[面试岗位信息]:**
{job}
**[面试业务问题]:**
{question}
**[用户相关简历]:**
{resume}
```
            """
    prompt = ChatPromptTemplate.from_template(prompt_template)
    chain = prompt | llm_qwen | JsonOutputParser()
    ans = await chain.ainvoke({'question':question,'job':job,'resume':resume})
    print(ans['analysis'])
    print(ans['answer'])
    if isinstance(ans, dict):
        print("软技能问题解答结束")
        return ans
    else:
        return {"analysis": '', "answer": ''}


async def get_answer_quality_eval(question:str,job:str,resume:str,answer:str)->dict:
    print("正在进行问题答案评估")
    prompt_template = """
# Role: 面试评估专家 (Interview Assessment Expert)

## 🎯 **你的任务 (Your Mission)**

你是一名顶级的面试评估专家，拥有多年技术和管理招聘经验。你的核心任务是基于我提供的候选人信息、职位要求、面试问题和候选人的回答，进行一次专业、深入、公正的评估。你需要严格遵循我为你定义的评估框架和标准，输出对用户答案进行评分。

---

## 📝 **评估框架与标准 (Evaluation Framework & Standards)**

你必须严格遵循以下标准。在评估前，首先判断问题属于哪一类，然后应用该类的具体标准。

### **第一步：判断问题类型 (Step 1: Classify the Question Type)**
从以下四种类型中选择一个最匹配的：
1.  **技术基础知识考察 (Technical Fundamentals)**
2.  **项目经历考察 (Project Experience)**
3.  **业务经历/场景题考察 (Business Sense / Case Study)**
4.  **软技能考察 (Soft Skills)**

### **第二步：应用评估标准进行分析 (Step 2: Apply Evaluation Criteria for Analysis)**

#### 1. 技术基础知识考察 (Technical Fundamentals)
*   **核心评估点：** 候选人是否具备扎实的、与职位要求匹配的核心技术知识、原理理解和基本技能。
*   **评估标准：**
    *   **准确性 (Accuracy):** 概念、术语、原理、语法是否正确？
    *   **深度与广度 (Depth & Breadth):** 对核心概念的理解是否深入（如原理、机制、优缺点）？知识面是否覆盖关键领域？
    *   **理解与应用 (Understanding & Application):** 是死记硬背还是真正理解？能否用自己的话解释并应用于简单场景？
    *   **清晰度与表达 (Clarity & Expression):** 解释是否简洁、有逻辑、专业？
    *   **最新动态意识 (Up-to-date Awareness - Bonus):** 是否了解相关技术的最新趋势？

#### 2. 项目经历考察 (Project Experience)
*   **核心评估点：** 候选人过去实际工作的真实性、深度、贡献度以及从项目中学习和成长的能力。
*   **评估标准 (STAR原则)：**
    *   **情景 (Situation):** 项目背景、目标、挑战是否清晰？
    *   **任务 (Task):** 个人角色和职责是否明确？
    *   **行动 (Action):**
        *   **技术深度：** 具体做了什么？技术选型原因？如何解决关键问题？
        *   **工程实践：** 是否体现了良好的代码规范、测试、版本控制等实践？
        *   **协作沟通：** 如何与团队协作？
    *   **结果 (Result):**
        *   **成果量化：** 个人贡献和项目成果是否用具体指标量化（如性能提升X%，成本下降Y%）？
        *   **业务影响：** 工作对业务的实际影响是什么？
    *   **反思与学习 (Reflection & Learning):** 有何成功经验、失败教训？如果重来如何改进？学到了什么？

#### 3. 业务经历/场景题考察 (Business Sense / Case Study)
*   **核心评估点：** 理解业务需求、将技术与业务结合、解决复杂开放性问题的逻辑思维能力。
*   **评估标准：**
    *   **业务理解 (Business Acumen):** 是否准确理解问题背后的业务背景、目标和核心需求？
    *   **问题定义 (Problem Framing):** 能否清晰界定问题的核心与边界？
    *   **分析框架 (Analytical Framework):** 思维是否结构化？能否将问题拆解并判断优先级？
    *   **解决方案 (Solution):**
        *   **关联性：** 技术方案是否紧密服务于业务目标？
        *   **可行性：** 是否考虑了技术、资源、时间的限制和风险？
        *   **数据驱动 (Data-Driven):** 是否考虑用数据指标来衡量效果？
    *   **沟通与应变 (Communication & Adaptability):** 能否清晰阐述方案？被挑战时能否灵活调整？

#### 4. 软技能考察 (Soft Skills)
*   **核心评估点：** 沟通协作、学习能力、问题解决方式、职业素养和文化匹配度。
*   **评估标准 (贯穿回答的始终)：**
    *   **沟通能力 (Communication):** 表达是否清晰、有条理？是否能积极倾听？
    *   **协作能力 (Collaboration):** 是否体现团队意识和处理分歧的能力？
    *   **学习能力与成长心态 (Learnability & Growth Mindset):** 是否表现出好奇心、反思总结和适应性？
    *   **解决问题能力 (Problem-Solving):** 面对模糊问题时，分析是否具备逻辑性和系统性？
    *   **主动性/责任感 (Proactiveness/Ownership):** 是否表现出主动承担责任、推动进展的特质？
    *   **职业素养 (Professionalism):** 回答是否诚实？态度是否积极专业？

---

## 📥 **输入信息 (Input Information)**

**【职位信息】**
{job}

**【候选人简历】**
```
{resume}
```

**【面试问题】**
```
{question}
```

**【候选人回答】**
```
{answer}
```

---

## 📤 **输出格式 (Output Format)**

请严格按照json格式生成答案， 存在两个键值 'score','eval' 
'score' 对应为 int 类型，表示你对答案生成的评分 （满分100分）
'eval' 对应类型为 string 类型  要包含以下方面：

*1. 优点分析 (Strengths)**
*   `[基于评估标准，分点列出候选人回答中的优点。例如：技术概念阐述准确，对XXX原理理解深入。]`
*   `[项目描述中，能够清晰运用STAR原则，量化指标明确。]`
*   `[...更多优点]`

**2. 待改进点分析 (Areas for Improvement)**
*   `[基于评估标准，分点列出候选人回答中的不足之处。例如：对技术选型背后的“为什么”解释不足，未能体现出权衡过程。]`
*   `[在描述项目贡献时，个人职责与团队成果有所混淆，个人贡献不够突出。]`
*   `[...更多待改进点]`

```
            """
    prompt = ChatPromptTemplate.from_template(prompt_template)
    chain = prompt | llm_qwen | JsonOutputParser()
    ans = await chain.ainvoke({'question':question,'job':job,'resume':resume,'answer':answer})
    print(ans['score'])
    print(ans['eval'])
    if isinstance(ans, dict):
        print("答案评估结束")
        return ans
    else:
        return {'score':60}




